//********************************************************************************************************
//*程 序 作 者 ： 杨 刘 佳
//*完 成 日 期 ： 2 0 2 4 年 3 月 5 日
//*章 节 ： 第一章
//*题  目 ： 编写一个程序，统计一个班一门课学生的成绩，并实现统计不及格的人数及名单，
//*          统计分数在全班平均分以上的学生人数及名单和个分数段学生算占比例。
//********************************************************************************************************

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
	float score[31];
	string name[31];
	int sum = 0;//学生总体情况
	float average = 0;//平均分
	
	void count_fall_student(string *student_name, float *student_score, int sum);//统计不及格学生
	float count_average_score(float *student_grade, int sum);//计算平均分
	void above_student(string *student_name, float *student_score, int sum, float average);//统计高于或等于平均分的学生
	void count_percentage(float *student_score, int sum);//计算各分数段百分比
	
	cout << "首先请输入学生成绩和姓名，若想结束，请输入-1。" << endl;
	for(int i = 0; i < 30; i++)
	{
		cout << "请输入第"  << i + 1 << "个学生的姓名和成绩：" << endl;
		cin >> name[i];
		if(name[i] == "-1")
		break;
		cin >> setw(8) >> score[i];
		sum++;
	}
	
	count_fall_student(name, score, sum);
	average = count_average_score(score, sum);
	above_student(name, score, sum, average);
	count_percentage(score, sum);
	
	return 0; 
}


//******************************************************************************************************
//定义子函数实现统计不及格学生姓名和人数的功能
//函数参数依次是指向学生姓名和成绩的指针以及学生的总人数
//返回值表示是否有不及格的学生，返回值为 0 则表示没有不及格学生，返回值为 1 表示有不及格学生
//******************************************************************************************************
void count_fall_student(string *student_name, float *student_score, int sum)
{
	int fall_student = 0;
	string fall[30];
	int j = 0;
	
	for(int i = 0; i < sum; i++)
	{
		if(student_score[i] < 60)
		{
		fall[j] = *(student_name + i);
		fall_student++;
		j++;
		}
	}
	if(fall_student > 0)
	{
		cout << "不及格学生一共有" << fall_student << "人，以下为不及格学生名单：" << endl;
		for(j = 0; j < fall_student; j++)
		cout << fall[j] << endl;
	}
	else
	cout << "没有不及格的学生。" << endl;
}


//*******************************************************************************************************
//定义子函数实现计算学生平均成绩的功能
//函数参数依次为指向学生成绩的指针和学生的总人数
//返回值为计算后的平均成绩
//*******************************************************************************************************
float count_average_score(float *student_grade, int sum)
{
	float total_score = 0;
	float average_score = 0;
	for(int i = 0; i < sum; i++)
	{
		total_score += *(student_grade + i);
	}
	average_score = total_score / sum;
	return average_score;
}

//*******************************************************************************************************
//定义子函数实现统计分数在平均分以上或等于平均分的学生人数及姓名的功能
//函数参数依次为指向学生姓名和成绩的指针，学生的总人数，学生总成绩的平均分
//*******************************************************************************************************
void above_student(string *student_name, float *student_score, int sum, float average)
{
	int j = 0;
	int above_sum = 0;
	string above_student[30];
	for(int i = 0; i < sum; i++)
	{
		if(*(student_score + i) >= average)
		above_student[j] = *(student_score + i);
		j++;		
		above_sum++;
	}
	cout << "分数大于等于平均分的学生人数：" << above_sum << endl;
	cout << "以下为分数大于等于平均分的学生：" << endl;
	
	for(j = 0; j < above_sum; j++)
	cout << above_student[j] << endl;
}


//*******************************************************************************************************
//定义子函数实现统计各分数段学生所占比例的功能
//函数参数依次为指向学生成绩的指针，学生的总人数
//*******************************************************************************************************
void count_percentage(float *student_score, int sum)
{
	float one = 0;
	float two = 0;
	float three = 0;
	float four = 0;
	float five = 0;
	float six = 0;//统计六个部分成绩
	
	for(int i = 0; i < sum; i++)
	{
		if(*(student_score + i) >= 0&&*(student_score + i) < 60)
		one++;
		else if(*(student_score + i) >= 60&&*(student_score + i) <= 69)
		two++;
		else if(*(student_score + i) >= 70&&*(student_score + i) <= 79)
		three++;
		else if(*(student_score + i) >= 80&&*(student_score + i) <= 89)
		four++;
		else if(*(student_score + i) >= 90&&*(student_score + i) < 99)
		five++;
		else if(*(student_score + i) == 100)
		six++;
	}
	
	one = (one / sum) * 100;
	two = (two / sum) * 100;
	three = (three / sum) * 100;
	four = (four / sum) * 100;
	five = (five / sum) * 100;
	six = (six / sum) * 100;
	
	cout << "分数在0 ~ 60分的同学占比" << one << "%" << endl;
	cout << "分数在60 ~ 69分的同学占比" << two << "%" << endl;
	cout << "分数在70 ~ 79分的同学占比" << three << "%" << endl;
	cout << "分数在80 ~ 89分的同学占比" << four << "%" << endl;
	cout << "分数在90 ~ 99分的同学占比" << five << "%" << endl;
	cout << "分数在100分的同学占比" << six << "%" << endl;
}